STM32从零开始(五)详解RCC库函数 您所在的位置:网站首页 stm32 usb库函数中有宏定义 STM32从零开始(五)详解RCC库函数

STM32从零开始(五)详解RCC库函数

2024-06-24 04:08| 来源: 网络整理| 查看: 265

目录 1.将RCC时钟配置重置为默认重置

其实不用单独调用,因为系统会自动运行systemInit这个函数,将时钟在启动的时候置为72mhz。具体每句话其实就是把rcc寄存器不同的位设置一下,设置的结果看手册第六章最后一节,rcc寄存器那里,一个一个对应过去即可

/** * @brief Resets the RCC clock configuration to the default reset state. * @param None * @retval None */ void RCC_DeInit(void) { /* Set HSION bit */ RCC->CR |= (uint32_t)0x00000001; /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ #ifndef STM32F10X_CL RCC->CFGR &= (uint32_t)0xF8FF0000; #else RCC->CFGR &= (uint32_t)0xF0FF0000; #endif /* STM32F10X_CL */ /* Reset HSEON, CSSON and PLLON bits */ RCC->CR &= (uint32_t)0xFEF6FFFF; /* Reset HSEBYP bit */ RCC->CR &= (uint32_t)0xFFFBFFFF; /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ RCC->CFGR &= (uint32_t)0xFF80FFFF; #ifdef STM32F10X_CL /* Reset PLL2ON and PLL3ON bits */ RCC->CR &= (uint32_t)0xEBFFFFFF; /* Disable all interrupts and clear pending bits */ RCC->CIR = 0x00FF0000; /* Reset CFGR2 register */ RCC->CFGR2 = 0x00000000; #elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) /* Disable all interrupts and clear pending bits */ RCC->CIR = 0x009F0000; /* Reset CFGR2 register */ RCC->CFGR2 = 0x00000000; #else /* Disable all interrupts and clear pending bits */ RCC->CIR = 0x009F0000; #endif /* STM32F10X_CL */ }

——————————————————————————

2.***配置外部高速振荡器(HSE)。

用来控制HSE的打开和关闭。HSE就是这 在这里插入图片描述我们要知道为什么叫HSE,就是high speed external,高速,外部的意思。就很好记。

/** * @brief Configures the External High Speed oscillator (HSE). * @note HSE can not be stopped if it is used directly or through the PLL as system clock. * @param RCC_HSE: specifies the new state of the HSE. * This parameter can be one of the following values: * @arg RCC_HSE_OFF: HSE oscillator OFF * @arg RCC_HSE_ON: HSE oscillator ON * @arg RCC_HSE_Bypass: HSE oscillator bypassed with external clock * @retval None */ void RCC_HSEConfig(uint32_t RCC_HSE) { /* Check the parameters */ assert_param(IS_RCC_HSE(RCC_HSE)); /* Reset HSEON and HSEBYP bits before configuring the HSE ------------------*/ /* Reset HSEON bit */ RCC->CR &= CR_HSEON_Reset; /* #define CR_HSEON_Reset ((uint32_t)0xFFFEFFFF) #define CR_HSEON_Set ((uint32_t)0x00010000) 置位用或,复位用与 */ /* Reset HSEBYP bit */ RCC->CR &= CR_HSEBYP_Reset; /* Configure HSE (RCC_HSE_OFF is already covered by the code section above) */ switch(RCC_HSE) { case RCC_HSE_ON: /* Set HSEON bit */ RCC->CR |= CR_HSEON_Set; break; //外部就连了个晶振,不能自己震荡,得有hse电路配合 case RCC_HSE_Bypass: /* Set HSEBYP and HSEON bits */ RCC->CR |= CR_HSEBYP_Set | CR_HSEON_Set; break; //这个是外部连接了时钟,直接连进来就直接用的时钟信号,不是晶振 default: break; } }

————————————————————————————————

3.等待HSE启动

HSE打开得等一段时间 注意返回值类型是ErrorStatus类型的,也就是0或者1。enum类型的枚举默认是int型的。 typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus; 在这里插入图片描述读取的是rcc_cr寄存器的这一位

/** * @brief Waits for HSE start-up. * @param None * @retval An ErrorStatus enumuration value: * - SUCCESS: HSE oscillator is stable and ready to use * - ERROR: HSE oscillator not yet ready */ ErrorStatus RCC_WaitForHSEStartUp(void) { __IO uint32_t StartUpCounter = 0; ErrorStatus status = ERROR; FlagStatus HSEStatus = RESET; /* Wait till HSE is ready and if Time out is reached exit */ do { HSEStatus = RCC_GetFlagStatus(RCC_FLAG_HSERDY); StartUpCounter++; } while((StartUpCounter != HSE_STARTUP_TIMEOUT) && (HSEStatus == RESET)); //如果等待时间过长或者标志位为1的时候就跳出循环继续往下 if (RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET) { status = SUCCESS; } else { status = ERROR; } return (status); }

————————————————————————————

4.调整内部高速振荡器(HSI)

在这里插入图片描述比较鸡肋,往里



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有